import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
import pyperclip
from datetime import datetime
from tkinter import LEFT
import re


def extract_info_from_clipboard(text):


    patterns = {
        "购买时间": re.compile(r"购买时间：(\d{4})-(\d{2})-(\d{2})(?:\s*|$)"),
        # 下面这个正则表达式会首先尝试匹配直到“[”，如果不行则匹配直到“商品价格”
        "商品规格": re.compile(
            r"商品规格：((?:(?![\[]|商品价格：).)*?(?:(?=\[)|(?=商品价格：)))"
        ),
        "商品价格": re.compile(r"商品价格：([\d\.]+)元(?:\s*|$)"),
        "订单编号": re.compile(r"订单编号：([\d]+)(?:\s*|$)")
    }


    # 更实用的正则表达式定义：
    patterns_practical = {
        "购买时间": patterns["购买时间"],
        "商品规格_to_bracket": re.compile(r"商品规格：([\s\S]*?)(?=\s*\[)"),  # 匹配直到“[”
        "商品规格_to_price": re.compile(r"商品规格：([\s\S]*?)(?=\s*商品价格：)"),  # 匹配直到“商品价格：”
        "商品价格": patterns["商品价格"],
        "订单编号": patterns["订单编号"]
    }

    info = {}

    # 商品规格的提取逻辑
    bracket_match = patterns_practical["商品规格_to_bracket"].search(text)
    price_match = patterns_practical["商品规格_to_price"].search(text)

    if bracket_match:
        info["商品规格"] = bracket_match.group(1).strip()
    elif price_match:
        info["商品规格"] = price_match.group(1).strip()
        # 如果没有匹配到任何内容，则“商品规格”字段为空
    else:
        info["商品规格"] = ""
    # 其他字段的提取逻辑

    for key, pattern in patterns.items():
        match = pattern.search(text)
        if match:
            if key == "购买时间":
                year, month, day = map(int, match.groups())
                # 存储格式为 MM.DD，确保是两位数
                info[key] = f"{month:02d}.{day:02d}"
            else:
                # 对于其他字段，直接存储匹配的第一个组
                info[key] = match.group(1).strip()  # 使用 strip() 去除前后的空白字符

    # 检查是否所有必要信息都已提取
    required_keys = {"购买时间", "商品规格", "商品价格", "订单编号"}
    if required_keys.issubset(info.keys()):
        # 格式化结果字符串
        result = f"{info['购买时间']}-{info['商品规格']}-{info['订单编号']}-{info['商品价格']}-0"
        return result
    else:
        # 返回缺失的字段信息（可选）
        missing_keys = required_keys - set(info.keys())
        return f"错误：信息提取不完整，缺失字段：{', '.join(missing_keys)}。"


class OrderInfoExtractor(tk.Tk):
    def __init__(self):
        super().__init__()
        self.current_entry = None
        self.order_id_entry = None
        self.order_id_label = None
        self.price_entry = None
        self.price_label = None
        self.spec_entry = None
        self.manual_input_tab = None
        self.spec_label = None
        self.clipboard_text_area = None
        self.clipboard_tab = None
        self.title("订单信息提取工具")
        self.geometry("350x270")  # 稍微调整窗口大小以适应新内容

        # 选项卡控件
        self.tab_control = ttk.Notebook(self)
        self.add_tabs()
        self.tab_control.pack(expand=1, fill='both')

        # 提交按钮和结果标签
        self.submit_button = ttk.Button(self, text="生成并复制", command=self.on_submit)
        self.submit_button.pack(pady=10)

        self.result_label = ttk.Label(self, text="", width=50, justify=LEFT)
        self.result_label.pack(pady=5)

        # 初始化变量
        self.input_mode = "clipboard"  # 默认选项卡为粘贴板

    def add_tabs(self):
        # 粘贴板选项卡
        self.clipboard_tab = ttk.Frame(self.tab_control)
        self.tab_control.add(self.clipboard_tab, text='粘贴板')
        self.clipboard_text_area = scrolledtext.ScrolledText(self.clipboard_tab, wrap=tk.WORD, width=35, height=10)

        self.clipboard_text_area.pack(padx=10, pady=10)

        # 手动输入选项卡
        self.manual_input_tab = ttk.Frame(self.tab_control)
        self.tab_control.add(self.manual_input_tab, text='手动输入')

        # 商品规格标签和输入框
        self.spec_label = ttk.Label(self.manual_input_tab, text="商品名称:")
        self.spec_label.grid(row=0, column=0, padx=10, pady=10)
        self.spec_entry = ttk.Entry(self.manual_input_tab, width=30)
        self.spec_entry.grid(row=0, column=1, padx=10, pady=10)
        self.spec_entry.bind("<Return>", self.move_to_next_entry)

        # 商品价格标签和输入框
        self.price_label = ttk.Label(self.manual_input_tab, text="商品价格:")
        self.price_label.grid(row=1, column=0, padx=10, pady=10)
        self.price_entry = ttk.Entry(self.manual_input_tab, width=30)
        self.price_entry.grid(row=1, column=1, padx=10, pady=10)
        self.price_entry.bind("<Return>", self.move_to_next_entry)

        # 商品编号标签和输入框
        self.order_id_label = ttk.Label(self.manual_input_tab, text="订单编号:")
        self.order_id_label.grid(row=2, column=0, padx=10, pady=10)
        self.order_id_entry = ttk.Entry(self.manual_input_tab, width=30)
        self.order_id_entry.grid(row=2, column=1, padx=10, pady=10)
        self.order_id_entry.bind("<Return>", self.move_to_previous_entry)
        
        # 用于跟踪当前焦点的输入框
        self.current_entry = self.spec_entry

        # 绑定全局快捷键 Ctrl+s
        self.bind_all("<Control-s>", self.output_entries)

    def output_entries(self,_):
        self.submit_button.invoke()

    def move_to_next_entry(self, _):
        if self.current_entry == self.spec_entry:
            self.price_entry.focus_set()
            self.current_entry = self.price_entry
        elif self.current_entry == self.price_entry:
            self.order_id_entry.focus_set()
            self.current_entry = self.order_id_entry
        elif self.current_entry == self.order_id_entry:
            self.spec_entry.focus_set()  # 回到第一个输入框
            self.current_entry = self.spec_entry
            
    def move_to_previous_entry(self, _):
        # 这里为了简单起见，只实现了从最后一个输入框回到第一个，
        # 你可以根据需要扩展这个函数来处理其他情况。
        if self.current_entry == self.order_id_entry:
            self.spec_entry.focus_set()
            self.current_entry = self.spec_entry
            # 注意：这里没有处理从中间一个输入框向前移动的逻辑，
        # 因为这通常不是通过回车键来实现的。如果需要，你可以添加相应的逻辑。

    def extract_info_from_manual(self):
        spec = self.spec_entry.get().strip()
        price = self.price_entry.get().strip()
        order_id = self.order_id_entry.get().strip()
        if not spec or not price or not order_id:
            messagebox.showerror("输入错误", "请确保所有字段都已填写！")
            return ""
            # 使用当前系统时间作为购买时间
        purchase_time = datetime.now().strftime('%m.%d')  # 更详细的格式示例
        return f"{purchase_time}-{spec}-{order_id}-{price}-0"

    def on_submit(self):
        if self.tab_control.tab(self.tab_control.select(), "text") == "粘贴板":
            text_content = self.clipboard_text_area.get("1.0", tk.END)
            result = extract_info_from_clipboard(text_content)
        else:  # 假设只有粘贴板和手动输入两个选项卡
            result = self.extract_info_from_manual()

        if result:
            # 更新UI
            self.result_label.config(text=result)
            # 复制结果到剪贴板
            pyperclip.copy(result)

        else:
            # 如果出错，显示错误信息
            self.result_label.config(text="输入错误或数据提取失败！")


if __name__ == "__main__":
    app = OrderInfoExtractor()
    app.mainloop()
